package thread;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ThreadWork4 {


    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException{
        System.out.print("请输入要扫描的根目录");
        String rootDirPath = scanner.next();
        File rootDir = new File(rootDirPath);
        if (!rootDir.isDirectory()) {
            System.out.println("您输入的根目录不存在或者不是目录，退出");
            return;
        }

        System.out.print("请输入要找出的文件名中的字符: ");
        String token = scanner.next();
        List<File> result = new ArrayList<>();
        // 因为文件系统是树形结构，所以我们使用深度优先遍历（递归）完成遍历
        scanDirWithContent(rootDir, token, result);
        System.out.println("共找到了符合条件的文件 " + result.size() + " 个，它们分别是");
        for (File file : result) {
            System.out.println(file.getCanonicalPath());
        }
    }

    private static void scanDirWithContent(File rootDir, String token, List<File> result) throws IOException {
        File[] files = rootDir.listFiles();
        if (files == null || files.length == 0) {
            return;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                scanDirWithContent(file, token, result);
            } else {
                if (isContentContains(file, token)) {
                    result.add(file.getAbsoluteFile());
                }
            }
        }
    }

    private static boolean isContentContains(File file, String token) throws
            IOException {
        StringBuilder sb = new StringBuilder();
        try (InputStream is = new FileInputStream(file)) {
            try (Scanner scanner = new Scanner(is, "UTF-8")) {
                while (scanner.hasNextLine()) {
                    sb.append(scanner.nextLine());
                    sb.append("\r\n");
                }
            }
        }
        return sb.indexOf(token) != -1;
    }


    public static void main2(String[] args) {

        //用户输入一个指定搜索的目录
        System.out.println("请输入要搜索的路径：");
        String basePath = scanner.next();

        // 针对用户进行简单判定
        File root = new File(basePath); // 相当是打开一个目录看看里面有什么
        if (! root.isDirectory()) {
            // 路径不存在,或者只是一个文件，此时无法进行操作
            System.out.println("输入的路径有误！！！");
            return;
        }

        // 此时路径是存在的
        // 再让用户输入一个要删除的文件名
        System.out.println("输入要删除的文件名：");
        String nameToDelete = scanner.next();

        // 针对指定的路径进行扫描
        // 先从根目录出发 root
        // 先看看当前目录是否有要删除的文件，如果有就删除，没有就跳过找下一个
        // 如果当前这里包含一些目录，再针对子目录进行递归
        scanDir(root, nameToDelete);
    }

    // 删除的方法
    private static void scanDir(File root, String nameToDelete) {
        System.out.println("[scanDir]" + root.getAbsolutePath());
        // 1.先列出 root 下的文件和目录
        File[] files = root.listFiles();
        if (files == null) {
            // 当前的 root 目录下没东西，是一个空的目录
            // 结束继续递归
            return;
        }

        // 2.遍历当前的列出结果
        for (File file : files) {
            if (file.isDirectory()) {
                //如果是目录就进行一步递归
                scanDir(file, nameToDelete);
            } else {
                // 如果是普通文件，就判断是否要删除
                if (file.getName().contains(nameToDelete)) {
                    System.out.println("确认是否要删除" + file.getAbsolutePath() + "嘛？");
                    String choise = scanner.next(); //选择的结果
                    if (choise.equals("y") || choise.equals("Y")) {
                        // 开始删除
                        file.delete();
                        System.out.println("删除成功！！！");
                    } else {
                        System.out.println("删除取消！！！");
                    }
                }
            }
        }
    }

    public static void main1(String[] args) {
        // 输入源和目标路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个你要拷贝的文件：");
        String srcPath = scanner.next();

        System.out.println("请输入你要拷贝到哪个地方：");
        String destPath = scanner.next();

        File srcFile = new File(srcPath); //源文件
        // 判断源文件是不是不存在或是一个目录
        if (!srcFile.isFile()) {
            // 不是文件什么都不做
            System.out.println("输入的路径有误！！！");
            return;
        }

        File destFile = new File(destPath); //目标文件
        // 判断目标文件是否存在
        if (destFile.isFile()) {
            System.out.println("输入的路径有误！！！");
            return;
        }

        // 开始拷贝操作
        try (InputStream inputStream = new FileInputStream(srcFile)) {
            OutputStream outputStream = new FileOutputStream(destFile);

            // 读操作
            while (true) {
                int src = inputStream.read();
                // 判断文件是否读完了
                if (src == -1) {
                    break;
                }
                // 写操作
                outputStream.write(src);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
